package com.youzhi.snake;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import static java.awt.event.KeyEvent.VK_A;
import static java.awt.event.KeyEvent.VK_SPACE;


/**
 * 主类
 * @author HP
 */
public class Start {
    public static void main(String[] args) {
        //1.绘制静态窗口  JFrame
        JFrame jFrame = new JFrame("YouZhi");
        //设置窗口的位置和大小
        jFrame.setBounds(600,100,1000,839);
        //设置是否可调整窗口大小
        jFrame.setResizable(false);
        //设置关闭窗口后退出
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //2.面板JPanel  可以加入到JFrame
        GamePanel j = new GamePanel();
        jFrame.add(j);
        //是否可见
        jFrame.setVisible(true);

    }
}
class GamePanel extends JPanel implements KeyListener, ActionListener {
    /**
     * 蛇的长度
     */
    int length;
    /**
     * 蛇的X坐标
     */
    int [] snakeX = new int [100];
    /**
     * 蛇的Y坐标
     */
    int [] snakeY = new int [100];
    /**
     * 豆子X坐标
     */
    int beanX;
    /**
     * 豆子Y坐标
     */
    int beanY;
    /**
     * 判断豆子是否在蛇身上
     */
    int a;
    /**
     * 判断是否失败
     */
    boolean isDid;
    /**
     *游戏是否开始
     */
    boolean isStart;

    /**
     * 方向判断
     * W 是上
     * S 是下
     * A 是左
     * D 是右
     */
    String fx;

    /**
     *定时器
     * 实现了ActionListener接口
     * 2个参数
     * 每隔多少秒执行一次    监听谁
     * 100毫秒执行一次 = 1秒执行10次
     */
    Timer timer = new Timer(200,this);

    /**
     * 构造器
     */
    public GamePanel(){
        /**
         * 初始化程序
         */
        init();
        /**
         * 获取键盘的监听事件
         * 1.获取焦点为true
         * 然后监听键盘
         */
        this.setFocusable(true);
        this.addKeyListener(this);
        /**
         * 让时间动起来
         */
        timer.start();
    }

    /**
     * 初始化方法
     */
    public void init(){
        fx = "W";
        isStart = false;
        isDid = false;
        length = 3;
        snakeX[0] = 320;snakeY[0]=320;
        snakeX[1] = 320;snakeY[1]=400;
        snakeX[2] = 320;snakeY[2]=480;
        randomBean();
    }

    /**
     * 生成豆子坐标代码
     */
    public void randomBean(){
        do {
            a =0;
            beanX = 80*((int) (Math.random()*10));
            beanY = 80*((int) (Math.random()*10));
            for(int i=0;i<length;i++){
                if(beanX == snakeX[i] & beanY == snakeY[i]){
                    a+=1;
                    break;
                }
            }
        }while (a!=0);

    }

    /**
     * 判断是否死亡
     */
    public void isDied(){
        for (int i = 1;i<length;i++){
            if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]){
                isDid = true;
                isStart = false;
            }
        }
    }

    /**
     * 起到画板的作用
     */
    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        //绘制广告栏
        Data.Game.paintIcon(this,g,800,0);
        //绘制游戏区域
        g.fillRect(0,0,800,800);

        //确定蛇头的方向
        if(fx.equals("W")){
            Data.HEAD1.paintIcon(this,g,snakeX[0],snakeY[0]);
        }else if(fx.equals("A")){
            Data.HEAD4.paintIcon(this,g,snakeX[0],snakeY[0]);
        }else if(fx.equals("S")){
            Data.HEAD3.paintIcon(this,g,snakeX[0],snakeY[0]);
        }else if(fx.equals("D")){
            Data.HEAD2.paintIcon(this,g,snakeX[0],snakeY[0]);
        }
        /**
         * 设置蛇身
         */
       for(int i = 1; i< length; i++){
               Data.BODY1.paintIcon(this,g,snakeX[i],snakeY[i]);
           }
        /**
         * 设置豆子
         */
        if((length-2) % 5 == 0){
            Data.BEAN1.paintIcon(this,g,beanX,beanY);
        }else {
            Data.BEAN2.paintIcon(this,g,beanX,beanY);
        }

       //游戏是否开始
        if(isStart==false && isDid == false){
            g.setColor(Color.white);
            g.setFont(new Font("宋体",Font.BOLD,40));
            g.drawString("按下空格开始游戏",200,300);
        }

        g.setColor(Color.red);
        g.setFont(new Font("宋体",Font.BOLD,20));
        g.drawString(String.valueOf(length-3),935,350);

        if(isDid == true){
            g.setColor(Color.red);
            g.setFont(new Font("宋体",Font.BOLD,30));
            g.drawString("您已经失败了，最终的分数为"+(length-3)+",请按下空格重新开始",100,400);
        }
    }


    /**
     *键盘按下，弹起
     * @param e
     */
    @Override
    public void keyTyped(KeyEvent e) {

    }

    /**
     * 键盘按下，未释放
     * @param e
     */
    @Override
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        //如果按下的是空格键
        if(keyCode == KeyEvent.VK_SPACE){
            /**
             * 如果是死亡状态，那就刷新
             */
            if(isDid){
                init();
            }
            isStart = !isStart;
            //重画
            repaint();
        }
        /**
         * 当游戏处于运行状态时候
         * 通过倾听WASD获得方向
         */
        if(isStart && isDid == false){
            /**
             * 如果方向朝上的话，不能朝下
             */
            if(fx == "W"){
                if(keyCode == KeyEvent.VK_W){
                    fx = "W";
                }else if (keyCode == KeyEvent.VK_A){
                    fx = "A";
                }else if(keyCode == KeyEvent.VK_D){
                    fx = "D";
                }
            }
            /**
             * 如果方向朝下的话，不能朝上
             */
            if(fx == "S"){
                if(keyCode == KeyEvent.VK_S){
                    fx = "S";
                }else if (keyCode == KeyEvent.VK_A){
                    fx = "A";
                }else if(keyCode == KeyEvent.VK_D){
                    fx = "D";
                }
            }
            /**
             * 如果方向朝左的话，不难朝右
             */
            if(fx == "A"){
                if(keyCode == KeyEvent.VK_W){
                    fx = "W";
                }else if(keyCode == KeyEvent.VK_S){
                    fx = "S";
                }else if(keyCode == KeyEvent.VK_D){
                    fx = "A";
                }
            }
            /**
 * 如果方向朝左的话，不难朝右
 */
            if(fx == "D"){
                if(keyCode == KeyEvent.VK_W){
                    fx = "W";
                }else if(keyCode == KeyEvent.VK_S){
                    fx = "S";
                }else if(keyCode == KeyEvent.VK_D){
                    fx = "D";
                }
            }
        }
    }

    /**
     * 释放键的时候
     * @param e
     */
    @Override
    public void keyReleased(KeyEvent e) {

    }

    /**
     * 执行定时操作
     * 定时器，监听时间，帧
     * @param e
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        /**
         * 当游戏启动时候
         * 小蛇移动
         */
        if(isStart && isDid == false){
            /**
             * 蛇身获取前面一个的坐标
             */
            for(int i = length;i>0;i--){
                snakeX [i] = snakeX [i-1];
                snakeY [i] = snakeY [i-1];
            }
            /**
             * 当蛇头朝上下左右时候的坐标的时候
             */
            if(fx.equals("W")) {
                snakeY [0] = snakeY[0] - 80;
                if(snakeY[0]<0){
                    snakeY[0]=720;
                }
            }else if(fx.equals("S")){
                snakeY [0] = snakeY[0] + 80;
                if(snakeY[0]>720){
                    snakeY[0]=0;
                }
            }else if(fx.equals("A")){
                snakeX [0] = snakeX[0] - 80;
                if(snakeX[0]<0){
                    snakeX[0]=720;
                }
            }else if(fx.equals("D")){
                snakeX [0] = snakeX[0] + 80;
                if(snakeX[0]>720){
                    snakeX[0]=0;
                }
            }
            /**
             * 判断蛇头有没有吃到豆子
             * 吃到就调用randomBean方法
             */
            if(snakeX[0] == beanX && snakeY[0] == beanY ){
                if((length-2) % 5 == 0){
                    length+=2;
                    /**
                     * 这里设置snakeX Y 的值是为了防止左上角出现身体
                     */
                    snakeX[length-1] = -80;
                    snakeY[length-1] = -80;
                    randomBean();
                }else {
                    length+=1;
                    randomBean();
                }
            }
            /**
             * 调用判断死亡方法
             */
            isDied();
            /**
             * 刷新界面
             */
            repaint();
        }
        /**
         * 启动计时器
         */
        timer.start();
    }
}

